package com.ruoyi.common.office;

import lombok.extern.slf4j.Slf4j;

import java.io.BufferedReader;
import java.io.File;
import java.io.InputStreamReader;
import java.util.Date;

@Slf4j
public class OfficeToPdfConverter {

    /**
     * 转换 Office 文件到 PDF
     * @param inputFilePath 输入文件路径（如 D:/test.docx）
     * @param outputDir 输出 PDF 目录（如 D:/pdfs）
     * @return 转换后的 PDF 路径，失败返回 null
     */
    public static String convertToPdf(String inputFilePath, String outputDir) {
        File inputFile = new File(inputFilePath);
        File outputDirectory = new File(outputDir);

        // 检查输入文件是否存在
        if (!inputFile.exists()) {
            System.err.println("输入文件不存在：" + inputFilePath);
            return null;
        }

        // 创建输出目录
        if (!outputDirectory.exists()) {
            boolean mkdir = outputDirectory.mkdirs();
            if (!mkdir){
                return null;
            }
        }

        String pdfFileName = inputFile.getName().replaceAll("\\.(doc|docx|xls|xlsx|ppt|pptx)$", ".pdf");
        String filePath = outputDir + File.separator + pdfFileName;

        if (new File(filePath).exists()){
            log.info("目标文件已存在,不需要文件转换");
            return filePath;
        }
        Date date1 = new Date();
        log.info("目标文件不存在,开启文件转换");

        // LibreOffice 转换命令（Windows 示例，Linux/Mac 需调整命令）
        // /Applications/LibreOffice.app/Contents/MacOS/soffice [选项] [文件路径]
        String[] commands = {
                "soffice", // LibreOffice 命令（Linux/Mac）；Windows 下为 "soffice.exe"
                "--headless", // 无头模式（无界面）
                "--convert-to", "pdf", // 转换为 PDF
                "--outdir", outputDir, // 输出目录
                inputFilePath // 输入文件
        };

        try {
            // 执行命令
            Process process = Runtime.getRuntime().exec(commands);

            // 读取命令输出（防止进程阻塞）
            try (BufferedReader reader = new BufferedReader(
                    new InputStreamReader(process.getErrorStream()))) {
                String line;
                while ((line = reader.readLine()) != null) {
                    System.out.println(line); // 输出错误信息（调试用）
                }
            }

            // 等待进程执行完成
            int exitCode = process.waitFor();
            if (exitCode == 0) {
                // 转换成功，返回 PDF 路径

                Date date2 = new Date();
                log.info("文件转换完成-用时:{} 秒",(date2.getTime() - date1.getTime()) / 1000 );
                return filePath;
            } else {
                System.err.println("转换失败，退出码：" + exitCode);
                return null;
            }

        } catch (Exception e) {
            return null;
        }
    }
}
